www.gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/example/controls/optionview/main.cpp
/********************************************************************** // // // ########## ###### ######### # ###### # // ############# ########### ######### ######### ### // ######## # ### ## ############# ## ## ##### # #### // #### ## ## ### ### ### # # ##### ##### // # ### # # ## ## ## ## ### // ## ###### ## ## #### #### # # ## // ######### ### ## ### ####### ###### ## ## ### // ###### ## ###### ## ## #### # ## #### // ####### ## ###### ## ### ## ## ### ###### // ######### ## ###### ## ###### ### ## ### # ##### // ## ###### ####### ### #### ## ## ####### ######## ## #### // ## #### ### # ### ### ## ########## ###### ## #### // ## ## ## ######### #### # ## // # ### // ## // ### // ## // // // 临风程序界面类库演示 //作者:临风 // //版本:1.0 // //声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到 // 你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在 // 修改的同时给作者一份同样的副本。 // 本类库不得用于任何商业用途,如确实需要,请与作者联系。 // //e-mail:ringphone@sina.com // //本文件说明:演示属性栏OptionView的使用。 // //属性栏说明: 属性栏有名称和值两项显示,三种数值编辑方式:编辑框输入 // (编辑方式),列表框选择或输入(选择方式),编辑框输入 // 及点击旁边的按钮进行更详细设置(浏览输入方式)。 // 输入值分显示值和设置值,一般情况下如果值是字符串,显示 // 值和设置值是一致的,如果是数值,则可能需要设置其设置值, // 比如[禁止修改|允许]这种选项("禁止修改"为显示名称,"允 // 许"为显示值,则可能需要设置1为设置值以方便后续的结果处 // 理。因此,获取选项值有以下几种方法(以[禁止修改|允许], // 设置值1为例): // GetName:获取选项名称,返回"禁止修改" // GetText:获取显示值,返回"允许" // GetInt:获取设置值,返回1 // **********************************************************************/ #include "ringmain.h" #include "resource.h" #define IOP_SELFILE 0 #define IOP_SELFONT 1 #define IOP_SHOWMSG 2 #define IDX_NAME 0 #define IDX_CANEDITNAME 1 #define IDX_TYPE 2 #define IDX_DATATYPE 3 #define IDX_DEFDATA 4 #define IDX_PACKLIST 5 BEGIN_SETUPMAINWINDOW(IS_DIALOG) BEGIN_DEF_VAR(NO_INIT) RingOptionView m_list,m_option; RingOptionItemSel m_itemSel; RingOptionItemList m_itemType,m_itemPackList,m_itemBro; RingOptionItemEdit m_itemVal; int m_index; END_DEF_VAR BOOL OnValChange(RingOptionItem* item) { int nIdx = m_option.GetSelectIndex(IDX_CANEDITNAME); if(nIdx == 1) //返回FALSE为限制修改 return FALSE; else return TRUE; } BEGIN_DEFMSG DEFMSG(WM_INITDIALOG) DEFCMD(OnAdd) DEFCMD(OnDel) DEFCMD(OnClear) DEFNOTIFY(ROPVN_SELCHANGE) DEFNOTIFY(ROPVN_BUTTONCLICK) DEFNOTIFY(ROPVN_VALUECHANGE) DEFCMD(OnClose) END_DEFMAINMSG END_SETUPMAINWINDOW BEGIN_REGMAINMSG REGCMD(IDOK,OnAdd) REGCMD(IDCANCEL,OnDel) REGCMD(IDC_CLEAR,OnClear) REGCMD(IDC_CLOSE,OnClose) REGMSG(WM_INITDIALOG) REGNOTIFY(ROPVN_VALUECHANGE) REGNOTIFY(ROPVN_SELCHANGE) REGNOTIFY(ROPVN_BUTTONCLICK) END_REGMSG BEGIN_SETUPWINDOW(listdlg,IS_DIALOG) BINDID(IDD_LISTOPTION) BEGIN_DEF_VAR(NO_INIT) ringStr m_str; RingEdit* m_edit; END_DEF_VAR BEGIN_DEFMSG DEFMSG(WM_INITDIALOG) DEFCMD(OnOK) END_DEFMSG(listdlg) END_SETUPWINDOW(listdlg) BEGIN_REGMSG(listdlg) REGMSG(WM_INITDIALOG) REGCMD(IDOK,OnOK) REGCMD(IDCANCEL,Close) END_REGMSG int RingMain() { APP_CREATEDIALOG(MAKEINTRESOURCE(IDD_MAIN)); return RingApp.Run(); } RINGMAINMSG(WM_INITDIALOG) { AssignItem(m_list,IDC_LISTFILE); AssignItem(m_option,IDC_OPTION); m_list.SetBkColor(0xFFDEDA); m_index = 1; //添加设置项 m_option.AddOption("子项名称","Item1"); //如果是列表项,设置OPTYPE_READONLY则只可选择不可输入 m_option.AddOption("名称修改","允许",0,OPTYPE_LIST|OPTYPE_READONLY,(LPARAM)"允许|禁止|只读"); m_option.AddOption("子项类型","独立",0,OPTYPE_LIST|OPTYPE_READONLY,(LPARAM)"独立|数据包|数据包子项"); //项目数据设置 m_itemType.SetName("数据类型"); //同样设置为只可选择不可输入,该选项应该在加入前设置 m_itemType.SetReadOnly(TRUE); m_itemType.SetSelection("默认|列表|浏览"); m_itemType.SetSelectIndex(0); m_option.AddOption(&m_itemType); m_itemVal.SetName("默认数据"); m_option.AddOption(&m_itemVal); //项目数据设置,但不添加到列表中 m_itemPackList.SetName("加入到数据包"); m_itemPackList.SetReadOnly(TRUE); m_itemSel.SetName("列表选项"); m_itemSel.SetValue("真|假"); m_itemBro.SetName("浏览选项"); m_itemBro.SetReadOnly(TRUE); m_itemBro.SetSelection("浏览文件|浏览字体|显示信息|不处理"); m_itemBro.SetSelectIndex(3); //设置子项名称项数值改变的处理函数 m_option.SetItemValChangeFunc(0,(RINGVCLASS*)this,(ROPV_CHECKVALFUNC)OnValChange); return FALSE; } RINGMAINCMD(OnAdd) { ringStr strName = m_option.GetText(IDX_NAME); char s[20]; int index; if(strName.len() > 0) { index = m_option.GetSelectIndex(IDX_TYPE); if(index == 1) { //数据包 m_list.AddOptionPack(strName.string()); m_index ++; wsprintf(s,"数据包%d",m_index); m_option.SetValue(s,0); m_itemPackList.AddSelection(strName.string()); if(strlen(m_itemPackList.GetText()) == 0) m_itemPackList.SetValue(strName.string()); return; } else { ringStr strDef = m_option.GetText(IDX_DEFDATA); LONG lVal = 0,lOption = 0; int type = OPTYPE_EDIT; switch(m_option.GetSelectIndex(IDX_DATATYPE)) { case 1://列表 type = OPTYPE_LIST; lOption = (LPARAM)m_itemSel.GetText(); break; case 2://浏览 type = OPTYPE_BROWSE; lVal = m_itemBro.GetSelectIndex(); break; } if(index == 0) //独立 m_list.AddOption(strName.string(),strDef.string(),lVal,type,lOption); else //数据包子项 m_list.AddSubOption(m_option.GetText(IDX_PACKLIST),strName.string(),strDef.string(),lVal,type,lOption); } m_index ++; wsprintf(s,"item%d",m_index); m_option.SetValue(s,0); } } RINGMAINCMD(OnDel) { RingOptionItem* item = m_list.GetOptionItem(); if(item) { if(item->IsPackItem()) m_itemPackList.DelSelection(item->GetName()); m_list.DelOption(item); } } RINGMAINCMD(OnClear) { m_itemBro.GetInt(); m_list.Clear(); m_itemPackList.Clear(); } RINGMAINNOTIFY(ROPVN_SELCHANGE) { if(param.lpropvnm->hdr.idFrom == IDC_OPTION) { int index = param.lpropvnm->item->GetSelectIndex(); switch(m_option.GetCurSel()) { case IDX_TYPE: { //子项类型变更 char szName[40]; if(index == 1) { //数据包 wsprintf(szName,"数据包%d",m_index); //其他设置都不需要,删除 m_option.DelOption(&m_itemType); m_option.DelOption(&m_itemVal); m_option.DelOption(&m_itemPackList); m_option.DelOption(&m_itemSel); m_option.DelOption(&m_itemBro); } else { //独立或数据包子项 wsprintf(szName,"Item%d",m_index); m_option.SetValue(szName,IDX_NAME); //AddOption会自动检测是否已加入过 m_option.AddOption(&m_itemType); m_option.AddOption(&m_itemVal); if(index == 0) //独立数据,删除数据包列表 m_option.DelOption(&m_itemPackList); else { //这两个子项必须跟在数据包列表后面,先删除,否则顺序会乱 m_option.DelOption(&m_itemSel); m_option.DelOption(&m_itemBro); //数据包子项,添加数据包列表 m_option.AddOption(&m_itemPackList); } index = m_itemType.GetSelectIndex(); if(index == 1) m_option.AddOption(&m_itemSel); //列表数据类型 else if(index == 2) m_option.AddOption(&m_itemBro); //浏览数据类型 } //设置子项名称 m_option.SetValue(szName,IDX_NAME); break; } case IDX_DATATYPE: { //数据类型变更 if(index == 1) { //列表,增加列表选项,删除浏览选项 m_option.AddOption(&m_itemSel); m_option.DelOption(&m_itemBro); } else if(index == 2) { //浏览,增加浏览选项,删除列表选项 m_option.DelOption(&m_itemSel); m_option.AddOption(&m_itemBro); } else { //默认,删除不需要的选项 m_option.DelOption(&m_itemSel); m_option.DelOption(&m_itemBro); } break; } case IDX_CANEDITNAME: { RingOptionItem* item = m_option.GetOptionItem(IDX_NAME); if(item) { if(index == 2) item->SetReadOnly(TRUE); //只读 else //可修改或使修改无效,设置为非只读,使修改无效在 //OnValChange函数中判断实现 item->SetReadOnly(FALSE); } break; } } } return 0; } RINGMAINNOTIFY(ROPVN_BUTTONCLICK) { if(param.lpropvnm->hdr.idFrom == IDC_OPTION) { if(strcmp(param.lpropvnm->item->GetName(),"列表选项")==0) { listdlg = NewRingObj(listdlg); if(Popup(listdlg,NULL,(LPARAM)param.lpropvnm->item->GetText())) param.lpropvnm->item->SetValue(listdlg->m_str.string()); DelRingObj(listdlg); } } else if(param.lpropvnm->hdr.idFrom == IDC_LISTFILE) { switch(param.lpropvnm->item->GetData()) { case IOP_SELFILE: { ringFile rf; if(rf.Select("所有文件(*.*)|*.*||")) param.lpropvnm->item->SetValue(rf.Fullname()); break; } case IOP_SELFONT: { ringFont font; if(font.Select()) { LOGFONT lf; font.GetLogFont(&lf); param.lpropvnm->item->SetValue(lf.lfFaceName); } break; } case IOP_SHOWMSG: { LPSTR lpstr = (LPSTR)param.lpropvnm->item->GetText(); if(lpstr) MsgBoxEx(param.lpropvnm->item->GetName(),MB_OK,strlen(lpstr)+1,lpstr); break; } } } return 0; } RINGMAINNOTIFY(ROPVN_VALUECHANGE) { return 0; } RINGMAINCMD(OnClose) { Close(); } RINGMSG(listdlg,WM_INITDIALOG) { m_str = (LPSTR)param.lParam; m_str = m_str.replace("|","\r\n"); m_edit = GetItem(m_edit,IDC_SLIST); if(m_edit) m_edit->SetValue(m_str.string()); return 0; } RINGCMD(listdlg,OnOK) { if(m_edit) { m_str = m_edit->GetText(); m_str = m_str.replace("\r\n","|"); Close(TRUE); } else Close(); }